#include <iostream>
#include <pthread.h>
#include <ctime>
#include <unistd.h>

#include "Blockqueue.hpp"
#include "Task.hpp"
void *Consumer(void *args)
{
    Blockqueue<task_t> *bq=static_cast<Blockqueue<task_t> *>(args); //args 是一个 void* 类型的指针,由于 void* 指针不携带类型信息，因此需要在使用前将其转换为具体的类型。
    while(true)
    {
        task_t t;
        bq->Pop(&t);
        t();
    }
}

void *Productor(void *args)
{
    srand(time(nullptr)^getpid());
    //static_cast 是 C++ 中的一种类型转换操作符，用于在类型之间进行显式转换。在这里，它将 void* 类型的指针 args 转换为 Blockqueue<task_t>* 类型的指针。
    Blockqueue<task_t> *bq=static_cast<Blockqueue<task_t> *>(args);//将一个 void* 类型的指针 args 转换为 Blockqueue<task_t>* 类型的指针，并将其赋值给 bq
    while(true)
    {
        
        bq->Equeue(Download);
        std::cout<<"productor->Download"<<std::endl;  
        sleep(1);
    }
}
int main()
{
    Blockqueue<task_t> *bq=new Blockqueue<task_t>();   //std::queue<task_t> tasks;：任务队列，存储 task_t 类型的任务。
    pthread_t c1,c2,p1,p2,p3;
    pthread_create(&c1,nullptr,Consumer,bq);
    pthread_create(&c2,nullptr,Consumer,bq);
    pthread_create(&p1,nullptr,Productor,bq);
    pthread_create(&p2,nullptr,Productor,bq);
    pthread_create(&p3,nullptr,Productor,bq);

    pthread_join(c1,nullptr);
    pthread_join(c2,nullptr);
    pthread_join(p1,nullptr);
    pthread_join(p2,nullptr);
    pthread_join(p3,nullptr);
    
    return 0;
}
